package clasificador.genetico.reglas;

import java.util.List;
import java.util.Random;

import utils.Tuple;
import datos.Atributo;
import datos.AtributoFinito;
import datos.MuestraClasificada;

public class GeneradorReglas<Clase> {

    private double probFallo;
    private MuestraClasificada<Clase> muestra;
    private AtributoFinito<Clase> aClase;
    private List<Atributo<?>> atributos;
    private Random r;

    public GeneradorReglas(MuestraClasificada<Clase> muestra, double nReglasMedio) {
        this.muestra = muestra;
        this.probFallo = 1.0 / (nReglasMedio);
        this.atributos = muestra.getAtributos();
        aClase = (AtributoFinito<Clase>) muestra.getClase();

        r = new Random();
    }

    public TGenotipo generar() {
        TGenotipo res = new TGenotipo();

        do {
            res.add(generarRegla());
        } while (r.nextDouble() > probFallo);

        return res;
    }

    public Tuple<int[], Integer> generarRegla() {
        int[] atributos = new int[this.atributos.size() - 1];
        for (int i = 0; i < this.atributos.size() - 1; i++) {
            atributos[i] = r.nextInt();
        }
        Integer clase = 1 << r.nextInt(aClase.getRango().size());
        Tuple<int[], Integer> regla = new Tuple<int[], Integer>(atributos, clase);
        return regla;
    }
}
